/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package baseDatos;

import entidades.Bateria;
import entidades.DetalleFamilia;
import entidades.Familia;
import entidades.Jaula;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Facundo
 */
public class FamiliaDAO {

    private String query;
    private Connection conDB;
    private PreparedStatement pst;

    public FamiliaDAO(Connection con) {
        this.conDB = con;
    }

    public FamiliaDAO() {
    }

    /**
     * @return the query
     */
    public String getQuery() {
        return query;
    }

    /**
     * @param query the query to set
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     * @return the conDB
     */
    public Connection getConDB() {
        return conDB;
    }

    /**
     * @param conDB the conDB to set
     */
    public void setConDB(Connection conDB) {
        this.conDB = conDB;
    }

    /**
     * @return the pst
     */
    public PreparedStatement getPst() {
        return pst;
    }

    /**
     * @param pst the pst to set
     */
    public void setPst(PreparedStatement pst) {
        this.pst = pst;
    }

    public boolean put(Familia res_getFamilia) {
        try {
            if (res_getFamilia.getDetalle() != null) {
                boolean insert = false;
                int cod_familia = this.getUltimoCodigo() + 1;
                int cod_padre = new AnimalDAO(this.getConDB()).getCodigoAnimal(res_getFamilia.getPadre());
                int cod_emple = 4;
                Bateria bat = (Bateria) res_getFamilia.getPadre().getUbicacion().getBateria().get(0);
                Jaula jau = bat.getJaula().get(0);
                int cod_bateria = new BateriaDAO(this.getConDB()).getCodBateria(jau);
                if (this.getConDB().getAutoCommit()) {
                    this.getConDB().setAutoCommit(false);
                }
                String sql_familia = "insert into pc_familia (numero_familia,codigo_padre,fecha_conformacion,codigo_empleado,codigo_bateria) "
                        + "values (" + cod_familia + "," + cod_padre + ",to_date('" + res_getFamilia.getFecha_conformacion().dateValue() + "','yyyy/MM/DD HH:MI')," + cod_emple + "," + cod_bateria + ")";
                System.out.println("Sentencia del insert en familia: " + sql_familia);
                this.setPst(this.getConDB().prepareStatement(sql_familia));
                this.getPst().executeUpdate(sql_familia);

                int cod_detFamilia = this.getUltimoCodigoDetalle() + 1;
                int cod_hembra = 0;
                Iterator iter_detalle = res_getFamilia.getDetalle().iterator();
                DetalleFamilia detFamilia = null;
                AnimalDAO daoHembra = new AnimalDAO(this.getConDB());
                boolean insert_detalle = false;
                while (iter_detalle.hasNext()) {
                    detFamilia = (DetalleFamilia) iter_detalle.next();
                    cod_hembra = daoHembra.getCodigoAnimal(detFamilia.getHembra());
                    Bateria batHembra = (Bateria) detFamilia.getHembra().getUbicacion().getBateria().get(0);
                    Jaula jauHembra = batHembra.getJaula().get(0);
                    cod_bateria = new BateriaDAO(this.getConDB()).getCodBateria(jauHembra);
                    String sql_detalleFamilia = "insert into pc_detalle_familia (codigo_detalle,codigo_familia,codigo_hembra,fecha_desde,fecha_hasta,codigo_bateria) "
                            + "values (" + cod_detFamilia + "," + cod_familia + "," + cod_hembra + ",to_date('" + detFamilia.getFecha_desde().dateValue() + "','yyyy/MM/DD HH:MI')," + null + "," + cod_bateria + ")";
                    System.out.println("Sentencia del insert de cada hembra a la familia: " + sql_detalleFamilia);
                    this.setPst(this.getConDB().prepareStatement(sql_detalleFamilia));
                    this.getPst().executeUpdate(sql_detalleFamilia);
                    cod_detFamilia++;
                }


                this.getConDB().commit();
                insert = true;
                System.out.println("hasta llega???");
                this.getPst().close();
                return insert;
            }
        } catch (SQLException ex) {
            try {
                this.getConDB().rollback();
            } catch (SQLException ex1) {
                Logger.getLogger(FamiliaDAO.class.getName()).log(Level.SEVERE, null, ex1);
                System.out.println("Excepcion: " + ex.getMessage() + ". No se puede deshacer.");
            }
            Logger.getLogger(FamiliaDAO.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Excepcion: " + ex.getMessage());
        }
        return false;
    }

    private int getUltimoCodigo() {
        int codigo = 0;
        ResultSet rs = null;
        String sql = "SELECT max(numero_familia) as numero FROM pc_familia";
        try {
            setPst(getConDB().prepareStatement(sql));
            rs = getPst().executeQuery();
            while (rs.next()) {
                codigo = rs.getInt("numero");
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("Ultimo codigo de familia: " + codigo + " query:" + sql);
        return codigo;
    }

    private int getUltimoCodigoDetalle() {
        int codigo = 0;
        ResultSet rs = null;
        String sql = "SELECT max(codigo_detalle) as maxdetalle FROM pc_detalle_familia";
        try {
            setPst(getConDB().prepareStatement(sql));
            rs = getPst().executeQuery();
            while (rs.next()) {
                codigo = rs.getInt("maxdetalle");
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(HistorialDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("Ultimo codigo de detallefamilia: " + codigo + " query:" + sql);
        return codigo;
    }
}
